package com.omni.monitor.plugin.trace_monitor;

import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import java.util.Map;

/**
 * 自动获取所有 SqlSessionFactory，并注入拦截器
 */
@Configuration
public class TraceDataSourceInterceptorInjector {

    // 注入 Spring 上下文（用于获取所有 SqlSessionFactory）
    @Autowired
    private ApplicationContext applicationContext;

    @Autowired
    private MyBatisSqlInterceptor traceInterceptor;

    /**
     * Spring 容器初始化完成后执行（确保所有 SqlSessionFactory 已创建）
     */
   //注释，先不使用这里注册 @PostConstruct
    @PostConstruct
    public void injectInterceptorToAllSqlSessionFactories() {
        // 1. 获取所有 SqlSessionFactory 实例（key 是 bean 名称，value 是实例）
        Map<String, SqlSessionFactory> sqlSessionFactoryMap =
                applicationContext.getBeansOfType(SqlSessionFactory.class);

        if (sqlSessionFactoryMap.isEmpty()) {
//            throw new RuntimeException("未发现任何 SqlSessionFactory 实例，请检查数据源配置");
        }

        // 2. 为每个 SqlSessionFactory 注入拦截器链
        for (SqlSessionFactory sqlSessionFactory : sqlSessionFactoryMap.values()) {
            // MyBatis-Plus 的拦截器需要通过 SqlSessionFactory 的 Configuration 添加
            org.apache.ibatis.session.Configuration configuration = sqlSessionFactory.getConfiguration();

            // 检查拦截器是否已添加（避免重复注入）
            if (!configuration.getInterceptors().contains(traceInterceptor)) {
                configuration.addInterceptor(traceInterceptor);
                // 打印日志，确认注入成功
                String dataSourceName = getDataSourceName(sqlSessionFactory);
                System.out.println("已为数据源 [" + dataSourceName + "] 注入拦截器");
            }
        }
    }

    /**
     * 辅助方法：获取数据源名称（从 SqlSessionFactory 关联的 DataSource 中提取）
     */
    private String getDataSourceName(SqlSessionFactory sqlSessionFactory) {
        try {
//            // 通过 SqlSessionFactoryBean 获取原始数据源（适用于 MyBatis 自动配置）
//            if (sqlSessionFactory instanceof SqlSessionFactoryBean) {
//                SqlSessionFactoryBean factoryBean = (SqlSessionFactoryBean) sqlSessionFactory;
//                return factoryBean.setDataSource();
//            }
            // 直接返回 SqlSessionFactory 的 bean 名称（简化处理）
            return sqlSessionFactory.toString();
        } catch (Exception e) {
            return "未知数据源";
        }
    }
}